Tisk pomoci Canvas.Pixels

Otázka od: Petr Daricek

19. 4. 2004 14:27

Ahoj,
  delam aplikaci s tiskem a potrebuji tisknout vlastni prerusovane a cerchovane
cary (bez vyuziti DELPHI stylu). Pouzivam vlastni algoritmy, ktere ale
vyuzivaji nastavovani barev pixelu tj. Printer.canvas.pixels[x,y]:=clBlack.
Pokud jako vystup pouzivam monitor, nebo PDF, tak je vse v poradku, ale pokud
to poslu na tiskarnu, tak se mi bud nic nevytiskne nebo jen sem tam nejaky
pixel. predpokladal jsem ze to je asi rozlisenim tiskarny (Jeden Pixel neni
zobrazitelny a tak se netiskne), ale pokud jsem zkousel misto jednoho pixelu
obarvit vzdy vice dle parametru printer.pageWidth a printer.pageheight, tak byl
vysledek stejny.
  Nevite cim to je zpusobene?
                                       Petr Daricek

Odpovedá: Pavol Stugel, NETGraphics

19. 4. 2004 21:14

najprv vykresli ak mas tych bodov viac do pomocnej bitmapy a potom do
printer.canvas.draw( ...)
> delam aplikaci s tiskem a potrebuji tisknout vlastni prerusovane a
cerchovane cary (bez vyuziti DELPHI stylu). Pouzivam vlastni algoritmy, ktere
ale vyuzivaji nastavovani barev pixelu tj. Printer.canvas.pixels[x,y]:=clBlack.
Pokud jako vystup pouzivam monitor, nebo PDF, tak je vse v poradku, ale pokud
to poslu na tiskarnu, tak se mi bud nic nevytiskne nebo jen sem tam nejaky
pixel. predpokladal jsem ze to je asi rozlisenim tiskarny (Jeden Pixel neni
zobrazitelny a tak se netiskne), ale pokud jsem zkousel misto jednoho pixelu
obarvit vzdy vice dle parametru printer.pageWidth a printer.pageheight, tak byl
vysledek stejny.
> Nevite cim to je zpusobene?


Odpovedá: Fitz Ladislav

20. 4. 2004 8:14

zdravim

za prve doporucuji nepouzivat Canvas.Pixels protoze pouziva api metodu
SetPixel ktera krome nastaveni pixelu take vraci puvodni hodnotu, ale radeji
SetPixelV ktera jen nastavi barvu
za druhe nevim presne jak vykreslujes tu caru, ale misto pageWidth a
PageHeight bych asi radeji pouzil DPI

nakreslit prerusovanou libovolne tlustou caru na W9x neni vubec zadna sranda
(pokud teda vyslovene nepotrebujes kulate ohranicenou pak totiz muzes pouzit
kresleni plnych car vhodne rozbytych)


Odpovedá: Petr Daricek

20. 4. 2004 9:55

> zdravim
>
> za prve doporucuji nepouzivat Canvas.Pixels protoze pouziva api metodu
> SetPixel ktera krome nastaveni pixelu take vraci puvodni hodnotu, ale radeji
> SetPixelV ktera jen nastavi barvu
> za druhe nevim presne jak vykreslujes tu caru, ale misto pageWidth a
> PageHeight bych asi radeji pouzil DPI
>
> nakreslit prerusovanou libovolne tlustou caru na W9x neni vubec zadna sranda
> (pokud teda vyslovene nepotrebujes kulate ohranicenou pak totiz muzes pouzit
> kresleni plnych car vhodne rozbytych)

Ahoj,
  momentalne kreslim tu caru pomoci modifikovaneho DDA Algoritmu.
  Rozbyti plne cary, me taky napadlo, ale jak to udelat, aby to bylo rychle,
tj. s co nejmensim poctem deleni atd. a taky aby nevznikaly chyby
zaokrouhlenim. Jestli mas nejaky algoritmus, rad se na nej kouknu a porovnam
to.
                           Petr Daricek

Odpovedá: Fitz Ladislav

20. 4. 2004 11:34

no momentalne ten zdrojak nemuzu najit (je mozny ze jsem ho uz i smazal) ale
princip byl takovy za jsem si zjistil sklon cary a jeji skutecnou delku
(pythagoras) a delku carecky
pak jsem si vzal pocatecni bod a nastavil ze ma byt plna cara
delku carecky jsem si upravil podle toho kolik mi jeste z te cary zbyvalo,
pak si ji otocil okolo pocatecniho bodu a pokud to byla plna cara tak
nakreslil
pak jsem prehodil z plne cary na prazdne misto a jako pocatecni souradnice
jsem si nastavil posledni koncove, snizil celkovou delku cary o delku
carecky
a dokolecka dokola dokud zbyvala nejaka celkova delka
pokud to bya lomena cara tak jsem si do dalsiho kola prenesl zbytek carecky
a zda je to plna nebo prazdna cara

pro vypocty jsem pouzival longint pricemz nejnizzi byt byl vlastne desetinna
cast - deleni probihalo pomoci rotace
sin a cos pro otaceni jsem pocital samozrejme jen na zacatku a to funkci
    procedure SinCos (angel : extended; var sin, cos : extended);
    asm
      FLD angel
      FSINCOS
      FSTP tbyte ptr [edx] // cos
      FSTP tbyte ptr [eax] // sin
      FWAIT
    end;

je jasne ze to asi jde i lepe ale me to celkem stacilo pro velmi jednoduche
vykreslovani - delena cara jejiz konce jsou zaobleny


Odpovedá: Petr Daricek

20. 4. 2004 14:19

> no momentalne ten zdrojak nemuzu najit (je mozny ze jsem ho uz i smazal) ale
> princip byl takovy za jsem si zjistil sklon cary a jeji skutecnou delku
> (pythagoras) a delku carecky
> pak jsem si vzal pocatecni bod a nastavil ze ma byt plna cara
> delku carecky jsem si upravil podle toho kolik mi jeste z te cary zbyvalo,
> pak si ji otocil okolo pocatecniho bodu a pokud to byla plna cara tak
> nakreslil
> pak jsem prehodil z plne cary na prazdne misto a jako pocatecni souradnice
> jsem si nastavil posledni koncove, snizil celkovou delku cary o delku
> carecky
> a dokolecka dokola dokud zbyvala nejaka celkova delka
> pokud to bya lomena cara tak jsem si do dalsiho kola prenesl zbytek carecky
> a zda je to plna nebo prazdna cara
>
> pro vypocty jsem pouzival longint pricemz nejnizzi byt byl vlastne desetinna
> cast - deleni probihalo pomoci rotace
> sin a cos pro otaceni jsem pocital samozrejme jen na zacatku a to funkci
> procedure SinCos (angel : extended; var sin, cos : extended);
> asm
> FLD angel
> FSINCOS
> FSTP tbyte ptr [edx] // cos
> FSTP tbyte ptr [eax] // sin
> FWAIT
> end;
>
> je jasne ze to asi jde i lepe ale me to celkem stacilo pro velmi jednoduche
> vykreslovani - delena cara jejiz konce jsou zaobleny

Ahoj,
  u tveho postupu ale muze vzniknout chyba. Predpokladam, ze zminene otaceni
provadis nasobenim sinem a cosinem(tedy spise prumety do x-ove a y-ove
souradnice). Protoze pracujes s realnymi cislama, tak nakonec musis zaokrouhlit
pri pocitani koncoveho bodu jedne carecky. Tady muze vzniknout chyba o jeden
bod, coz neni tak hrozne, ale vzhledem k tomu, ze tento chybny koncovy bod
prohlasime za pocatek dalsiho, tak v nasledujicim kroku, jsou uz to body dva
atd.
                                    Petr Daricek